<?php

/**
 * ==========================================
 * Configuración y arranque de la aplicación.
 * ==========================================
 */

require __DIR__.'/../vendor/autoload.php';

/**
 * Carga variables de entorno desde un archivo .env
 */
\App\Helpers\Env::readFile();

/**
 * Establece variables de entorno de la aplicación.
 */
foreach (\App\Core\Config::readFile('application') as $key => $value) {
    \App\Helpers\Env::set('app.'.$key, $value);
}

/**
 * Crea una instancia del framework.
 */
$app = \Flight::app();

/**
 * Establece opciones de configuración del framework.
 */
foreach (\App\Core\Config::readFile('framework') as $key => $value) {
    $app->set($key, $value);
}

/**
 * Define el manejo de errores y excepciones.
 */
$app->map('error', [new \App\Controllers\ApiController($app), 'error']);
$app->map('notFound', [new \App\Controllers\ApiController($app), 'notFound']);

/**
 * Registra los servicios del framework.
 */
foreach (\App\Core\Config::readFile('services') as $option) {
    $app->register($option['name'], $option['class'], $option['params'] ?? null);
}

/**
 * Crea una instancia del enrutador.
 */
$router = $app->router();

/**
 * Se pasa la variable $router al archivo
 * y carga las rutas de la aplicación.
 */
require __DIR__.'/routes.php';

/**
 * Inicia la ejecución del framework.
 */
$app->start();
